package auctionatr

import groovy.time.BaseDuration
import groovy.time.TimeCategory

/**
 * 
 * Die Klasse User definiert die Informationen eines Userprofils.
 * Jeder User kann mehrere Auktionen anlegen und mehrere Gebote abgeben.
 * 
 * @author Can Paul
 *
 */

class User {
	
	/**
	 * Bei der Registrierung eines Users müssen gewisse Eingabebedingungen erfüllt sein. Die Validierung erfolgt mithilfe der constraints.
	 * 
	 * @username Jeder Benutzername darf nur einmal vergeben werden. Dieses Feld muss ausgefüllt werden. Es können Zahlen von 0-9 und Buchstaben von a-z und A-Z gewählt werden. Die maximale Zeichenzahl des Benutzernamens beträgt 50 Zeichen.
	 * @password Das Passwort muss in beiden Passwortfeldern übereinstimmen und darf nicht leer bleiben.
	 * @email Jede E-Mail-Adresse darf nur einmal vergeben werden. Dieses Feld muss ausgefüllt werden.
	 * @aboutUser Freiwilliges Feld
	 * @facebookName Freiwilliges Feld 
	 * @twitterName Freiwilliges Feld
	 * @firstName Dieses Feld muss ausgefüllt werden. Als Zeichen sind nur Buchstaben erlaubt. 
	 * @lastName Dieses Feld muss ausgefüllt werden. Als Zeichen sind nur Buchstaben erlaubt.
	 * @street Freiwilliges Feld
	 * @zip Als Zeichen sind nur Zahlen erlaubt.
	 * @city Als Zeichen sind nur Buchstaben erlaubt.
	 * @accountNumber Als Zeichen sind nur Zahlen erlaubt.
	 * @bankCode Freiwilliges Feld
	 * @birthday Das Mindestalter für eine Registrierung liegt bei 18 Jahren.
	 * @avatar Es kann ein Profilbild hochgeladen werden, das maximal eine Größe von 16 KB besitzt.
	 * 
	 */
	
    static constraints = {
		username(blank:false,unique:true, maxSize:50, matches:"[0-9a-zA-Z]+")
		
		//Joe: Password wird mit password2(wird nicht in der DB gespreichert) überprüft
		password(blank:false,password:true,validator: {password, obj ->
			def password2 = obj.properties['password2']
			if(password2 == null) return true 
			password2 == password ? true : ['default.invalid.matchingpasswords']})
	
		password2(blank:false,password:true)
		email(blank:false,email:true,unique:true)
		facebookName()
		aboutUser()
		twitterName()
		firstName(blank:false,matches:"[a-zA-Z ]+")
		lastName(blank:false,matches:"[a-zA-Z ]+")
		street()
		zip(matches:"[0-9]+")
		city(matches:"[a-zA-Z ]+")
		accountNumber(matches:"[0-9]+")
		bankCode()
		role(display:false,inList:["user","admin"])
		
		//Joe:Test auf 18 Jahre
		birthday(validator:{return(it< use(TimeCategory){18.years.ago  as Date})})
		
		
		avatar(nullable:true, maxSize: 163840)
		avatarType(nullable:true)
		
	}	
	
	/** Ein User kann mehrere Auktionen anlegen und mehrere Gebote abgeben. */
	static hasMany = [bids : Bid, auctions : Auction ]
	
	/** Benutzername */
	String username
	
	/** Passwort */
	String password
	
	/** Passwortbestätigung */
	String password2
	
	/** E-Mail-Adresse */
	String email
	
	/** facebook-Name */
	String facebookName
	
	/** Über mich */
	String aboutUser
	
	/** Twitter-Name */
	String twitterName
	
	/** Aktuelles Datum */
	Date start = new Date()
	
	/** Geburtstag */
	Date birthday
	
	/** Vorname */
	String firstName
	
	/** Nachname */
	String lastName
	
	/** Strasse */
	String street
	
	/** Postleitzahl */
	String zip
	
	/** Stadt */
	String city
	
	/** Kontonummer */
	String accountNumber
	
	/** Bankleitzahl */
	String bankCode
	
	/** Rolle: Jedem neuregistrierten User wird standardmäßig die Rolle "User" zugeteilt. Als weitere Rolle gibt es den Administrator. */
	String role="user"
	
	/** Registrierungsdatum */
	Date dateCreated //Note: this is a special name, Grails will automatically fill in the value when the instance gets saved to the database for the first time
	
	/** Datum, an dem das Userprofil zuletzt aktualisiert wurde. */
	Date lastUpdated //Grails will fill in the date each subsequent time the updated record is saved back to the database
	
	/** Profilbild */
	byte[] avatar
	
	/** Bildtyp des Profilbildes */
	String avatarType
	
	/**
	 * Liefert die Rolle des Users als Boolean-Wert
	 * @return true: User hat die Rolle des Administrators; false: User ist kein Administrator.
	 */
	boolean isAdmin(){
		return role == "admin"
	}
	/**
	 * Die als "transients" aufgelisteten Variablen werden nicht in der Datenbank abgespeichert. 
	 * In diesem Fall betrifft dies die wiederholte Passworteingabe (password2) und die Rolle "admin".
	 */
	static transients = ['password2','admin'] //Joe: Password2 und admin werden nicht in DB gespeichert
	
	/** Passwort wird verschlüsselt, bevor es in der Datenbank abgelegt wird. */
	def beforeInsert = {
		password = password.encodeAsSHA()
	}
	
}
